package com.wish.g01.file.service;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;


@Service
public class QiNiService {

    @Value("${qiniu.accessKey}")
    private String accessKey;

    @Value("${qiniu.secretKey}")
    private String secretKey;

    // 空间名称
    @Value("${qiniu.bucket}")
    private String bucket;

    /**
     *
     * @param file 上传的文件
     * @param upToken  上传凭证
     * @param fileName 默认不指定key的情况下，以文件内容的hash值作为文件名
     * @return
     */
    public  DefaultPutRet uploadFeil(MultipartFile file,String fileName,String upToken) {

        UploadManager uploadManager = getUploadManager();
        try {
            // 上传文件
//              file size 大于 configuration.putThreshold 时采用分片上传
//            分片上传时，每个上传操作会占用 blockSize 大小内存，blockSize
//           也即分片大小， 在分片 v1 中 blockSize 为 4M； 分片 v2 可自定义
//             blockSize，定义方式为：Configuration
//
            Response response = uploadManager.put(file.getBytes(), fileName, upToken);
            //解析上传成功的结果
            return  new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
        } catch (Exception e) {
            // 打印 错误信息
            System.err.println(e.getMessage());
        }
        return null;
    }


    public DefaultPutRet put(InputStream inputStream, long size, String key, String token) throws Exception {
        UploadManager uploadManager = getUploadManager();

        Response response = uploadManager.put(inputStream, key, token, null, null);
        return new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    }

    /**
     *
     * @return  获取上传器
     */
    public UploadManager getUploadManager() {
        // 自动判断 区域，使用相应域名处理
        Configuration cfg = new Configuration(Region.autoRegion());
        // 设置 Http 请求
        cfg.useHttpsDomains = false;
        // 生成 上传器
        return new UploadManager(cfg);
    }

    public String getToken() {
        // 获取 上传 凭证
        Auth auth = Auth.create(accessKey, secretKey);
        return auth.uploadToken(bucket);
    }
}
